/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Ui;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author Esteban
 */
public class PanelGrupoCompartido extends javax.swing.JPanel {

    /**
     * Creates new form PanelGrupoCompartido
     */
    public PanelGrupoCompartido() {
        initComponents();
    }

    private void setProfesor(String prof){
        campoProfesor.setText(prof);
    }
    
    private void setNumeroGrupo(int num){
        campoNumero.setText(num+"");
    }
    
    private void setCompaniero(String comp){
        campoCompaniero.setText(comp);
    }
    
    public void updateData(InfoGrupoCompartido grupo, JTable tabla) {
        this.grupo=grupo;
        this.tabla=tabla;
        setSuperPanel(grupo.getSuperPanel());
        setProfesor(this.grupo.getProfesor());
        setNumeroGrupo(this.grupo.getNumero());
        setCompaniero(this.grupo.getAcompaniante());
    }
    
    private void asignarEstudiante(){
        
        if(verificarCursoPorMatricular(grupo.getEstudiante1(), grupo.getCurso1(), grupo.getAnio(), grupo.getMes1())==false){
        
            if(verificarHorarioPorMatricular(grupo.getEstudiante1(), grupo.getAnio(), grupo.getMes1(), grupo.getDia1(), grupo.getHoraInicio1(), grupo.getHoraFin1())==false){
            
                int confirmado = JOptionPane.showOptionDialog(
                    this,"Clase: "+grupo.getCurso1()+"-"+grupo.getCurso2()+
                    "\nAño: "+grupo.getAnio()+
                    "\nMes: "+grupo.getMes2()+
                    "\nNúmero de grupo: "+grupo.getNumero()+
                    "\nHorario: "+grupo.getDia2()+" "+grupo.getHoraInicio2()+" - "+grupo.getHoraFin2()+
                    "\nProfesor: "+grupo.getProfesor()+
                    "\nCompañero de clase: "+grupo.getAcompaniante()+
                    "\n \nConfirmar la asignación del estudiante "+grupo.getEstudiante2()+", de cédula "+grupo.getEstudiante1()+", al grupo compartido", "Confirmación requerida",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,
                    null,    // null para icono por defecto.
                    new Object[] { "Correcto", "Cancelar"},   // null para YES, NO y CANCEL
                    null);
        
                
                if(confirmado==0){
                    Connection conexion=null;
                    Statement sentencia=null;
                    ResultSet resultado=null;
        
                    try {
                        Class.forName("org.postgresql.Driver");
                    }catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                    try{
                        conexion = DriverManager.getConnection(cadenaConexion);
                        sentencia = conexion.createStatement();
                        String consultaSQL = "update grupo set cant_alumnos=2 where anio="+grupo.getAnio()+" and numero="+grupo.getNumero()+" and curso="+grupo.getCurso1()+" and mes="+grupo.getMes1()+" and dia="+grupo.getDia1()+" and hora_inicio="+grupo.getHoraInicio1()+" and hora_fin="+grupo.getHoraFin1();
                        resultado = sentencia.executeQuery(consultaSQL);

                    } catch (SQLException e) {
                        if(e.getSQLState().equals("02000")){ //no_data , una actualización no devuelve nada
                            matricularEstudiante();
                        }
                        else{       
                            JOptionPane.showMessageDialog(this, "\n Imposible asignar estudiante al grupo compartido \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                            e.printStackTrace();
                            conexion = null;
                        }
                    }
                    finally {
                        if (resultado != null) {
                            try {
                                resultado.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        if (sentencia != null) {
                            try {
                                sentencia.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                        if (conexion != null) {
                            try {
                                conexion.close();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            else{
                JOptionPane.showMessageDialog(this, "\nImposible matricular estudiante en dicho horario.\nEl estudiante ya está inscrito en este u otro curso a la misma hora actualmente ", "Error", JOptionPane.ERROR_MESSAGE); 
            }
        }        
        else{
            JOptionPane.showMessageDialog(this, "\nImposible matricular estudiante en dicho curso.\nEl estudiante ya está inscrito en otro grupo de "+eliminarEspaciosBlancosFinal(grupo.getCurso2())+" actualmente ", "Error", JOptionPane.ERROR_MESSAGE); 
        }
    }
    
    public void matricularEstudiante(){
        Connection conexion=null;
                Statement sentencia=null;
                ResultSet resultado=null;
        
                try {
                    Class.forName("org.postgresql.Driver");
                }catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                try{
                    conexion = DriverManager.getConnection(cadenaConexion);
                    sentencia = conexion.createStatement();
                    String consultaSQL = "insert into matricula(anio,numero,estudiante,fecha_matricula,retiro,curso,mes) VALUES ("+grupo.getAnio()+","+grupo.getNumero()+",'"+grupo.getEstudiante1()+"','"+new Timestamp(new java.util.Date().getTime())+"','false',"+grupo.getCurso1()+","+grupo.getMes1()+")";
                    resultado = sentencia.executeQuery(consultaSQL);

                } catch (SQLException e) {
                    if(e.getSQLState().equals("02000")){ //no_data , una inserción no devuelve nada
                        JOptionPane.showMessageDialog(this,"\n ¡Estudiante asignado y matriculado al grupo compartido exitósamente!","Éxito",JOptionPane.INFORMATION_MESSAGE);
                        cerrarPanel();
                    }
                    else{       
                        JOptionPane.showMessageDialog(this, "\n Imposible matricular estudiante en el curso \n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
                        e.printStackTrace();
                        conexion = null;
                    }
                }
                finally {
                    if (resultado != null) {
                        try {
                            resultado.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (sentencia != null) {
                        try {
                            sentencia.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (conexion != null) {
                        try {
                            conexion.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
    }
    
    public void setSuperPanel(JDialog superPanel){
        this.superPanel=superPanel;
    }
    
    private void cerrarPanel(){
        superPanel.setVisible(false);
        superPanel.dispose();
        superPanel=null;
    }
    
    private void asignar(){
        this.setBackground(tabla.getSelectionBackground());
        asignarEstudiante();
    }
    
    private boolean verificarCursoPorMatricular(String estudiante, int curso, int anio, int mes){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String consultaSQL = "select retiro from matricula where curso="+curso+" and anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"'"; //selecciono algún dato, el de menos bytes
            resultado = sentencia.executeQuery(consultaSQL);
            if(resultado.next()){
                return true;
            }
            else{
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible comprobar si el estudiante matriculó dicho curso\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
    
    private boolean verificarHorarioPorMatricular(String estudiante, int anio, int mes, int dia, int hora_inicio, int hora_fin){
        Connection conexion=null;
        Statement sentencia=null;
        ResultSet resultado=null;
        
        try {
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try{
            conexion = DriverManager.getConnection(cadenaConexion);
            sentencia = conexion.createStatement();
        
            String matricula="select curso,numero from matricula where anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"'";
            String grupoo="select hora_inicio,hora_fin,dia,curso,numero from grupo where anio="+anio+" and mes="+mes;
            String consultaSQL="select hora_inicio from ("+matricula+")alias1,("+grupoo+")alias2 where alias1.curso=alias2.curso and alias1.numero=alias2.numero and alias2.dia="+dia+" and alias2.hora_inicio="+hora_inicio+" and alias2.hora_fin="+hora_fin;
            
            //String consultaSQL = "select retiro from matricula where anio="+anio+" and mes="+mes+" and estudiante='"+estudiante+"' and dia="+dia+" and hora_inicio="+hora_inicio+" and hora_fin="+hora_fin; //selecciono algún dato, el de menos bytes 
            resultado = sentencia.executeQuery(consultaSQL);
            if(resultado.next()){
                return true;
            }
            else{
                return false;
            }
                    
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(this, "\n Imposible comprobar si el estudiante ya está matriculado en otros cursos a la misma hora\n Error en la base de datos", "Error", JOptionPane.ERROR_MESSAGE);
            e.printStackTrace();
            conexion = null;
        }
        finally {
            if (resultado != null) {
                try {
                    resultado.close();
                } catch (Exception e) {
                e.printStackTrace();
                }
            }
            if (sentencia != null) {
                try {
                    sentencia.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conexion != null) {
                try {
                    conexion.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return false;
    }
    
    private String eliminarEspaciosBlancosFinal(String hilera){
        int pos=0;
        String newHilera="";
        int paso=0;
        for(int i=hilera.length()-1;i>=0;i--){
            if(hilera.charAt(i)!=' '){
                pos=i;
                paso=1;
                break;
            }
        }
        if(paso==1){
            for(int j=0;j<=pos;j++){
                newHilera=newHilera+hilera.charAt(j);
            }
        }
        else{
            newHilera=hilera;
        }
        return newHilera;
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        profesor = new javax.swing.JLabel();
        numero = new javax.swing.JLabel();
        companiero = new javax.swing.JLabel();
        campoProfesor = new javax.swing.JLabel();
        campoNumero = new javax.swing.JLabel();
        campoCompaniero = new javax.swing.JLabel();
        btnAsignar = new javax.swing.JButton();

        setBackground(new java.awt.Color(255, 255, 255));
        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 153, 204), 3));

        profesor.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        profesor.setText("Profesor:");

        numero.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        numero.setText("Número de grupo:");

        companiero.setFont(new java.awt.Font("Calibri", 1, 14)); // NOI18N
        companiero.setText("Compañero de clase:");

        campoProfesor.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N

        campoNumero.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N

        campoCompaniero.setFont(new java.awt.Font("Calibri", 0, 14)); // NOI18N

        btnAsignar.setFont(new java.awt.Font("Calibri", 0, 16)); // NOI18N
        btnAsignar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Img/asignar.png"))); // NOI18N
        btnAsignar.setText("Asignar al grupo");
        btnAsignar.setBorder(null);
        btnAsignar.setOpaque(false);
        btnAsignar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                btnAsignarMousePressed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(companiero)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(campoCompaniero, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(profesor)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(campoProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, 265, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(numero)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(campoNumero, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnAsignar, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(34, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnAsignar)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(profesor)
                            .addComponent(campoProfesor, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(numero, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(campoNumero, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(companiero)
                            .addComponent(campoCompaniero))))
                .addContainerGap(20, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnAsignarMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAsignarMousePressed
        // TODO add your handling code here:
        asignar();
    }//GEN-LAST:event_btnAsignarMousePressed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAsignar;
    private javax.swing.JLabel campoCompaniero;
    private javax.swing.JLabel campoNumero;
    private javax.swing.JLabel campoProfesor;
    private javax.swing.JLabel companiero;
    private javax.swing.JLabel numero;
    private javax.swing.JLabel profesor;
    // End of variables declaration//GEN-END:variables
    private InfoGrupoCompartido grupo;
    private JTable tabla;
    private static final String cadenaConexion = "jdbc:postgresql://localhost/SMAAMDB?" + "user=postgres&password=root";
    private JDialog superPanel;
}
